package com.lqk.demo.concurrencytools.threadpool.juc.semaphore;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Semaphore;

import static com.lqk.demo.n2.util.Sleeper.sleep;

/**
 * @author lqk
 * @date 2022/1/12 13:49
 *
 * Semaphore
 * [ˈsɛməˌfɔr] 信号量，用来限制能同时访问共享资源的线程上限。
 */

@Slf4j
public class TestSemaphore {
    public static void main(String[] args) {
        // 创建 Semaphore 对象, 参数1: 限制数量, 参数2(可选): 是否公平锁
        Semaphore semaphore = new Semaphore(3);
        // 10个线程同时运行
        for (int i = 0; i < 10; i++) {
            int j = i;
            new Thread(()->{
                // 获取许可
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                try {
                    log.debug(j+": running...");
                    sleep(1);
                } finally {
                    // 释放许可
                    semaphore.release();
                }
            },"t"+j).start();
        }

    }
}
